home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1995 #5 & #6 / Amiga Plus CD - 1995 - No. 5 and 6.iso / pd / serien / purity / nr.9 / kickpascal-programme / leftymouse / leftymouse.p < prev    next >
Text File  |  1995-04-19  |  4KB  |  173 lines

  1. Program LeftyMouse;
  2.  
  3. { Version 1.0
  4.  
  5.   © 1993 by Björn Schotte
  6.  
  7.   FREEWARE                }
  8.  
  9. Uses ExecIO, Intuition, Graphics;
  10.  
  11. {$opt b-;
  12.   incl "exec/interrupts.h",
  13.        "devices/input.h",
  14.        "devices/inputevent.h"}
  15.  
  16. Const
  17.  MYPORTNAME = "LeftyMouse.Port";
  18.  LM_TASKNAME = "LeftyMouse.Task";
  19.  conpos      = "CON:100/60/330/63/LeftyMouse";
  20.  
  21. Type CodeTyp = Array[1..15] of Word;
  22.  
  23. Var port        : p_MsgPort;    { Port zur Kommunikation mit dem Device }
  24.     ioreq       : p_IOStdReq;   { Hier reicht Standard-Struktur }
  25.     inter       : Interrupt;    { Interrupt-Struktur zum Handler }
  26.     err         : integer;      { Fehlernummern der Device-Operationen }
  27.     ThisTask    : p_Task;       { Zeiger auf diesen Task }
  28.     _paslibbase : Byte; IMPORT; { Pascal-interne Adresse }
  29.     InterfaceCode : Codetyp;    { Speicher für kurze Assembler-Routine }
  30.     Sig,SigBit,Signals : Long;
  31.  
  32. Procedure installed;
  33. Begin
  34.   If FromWB Then
  35.   Begin
  36.     Reset(output,conpos);
  37.     If IOResult>0 Then exit;
  38.   End;
  39.   Writeln(#27"[33mLeftyMouse V1.0"#27"[0m");
  40.   Writeln("1993 by",#27,"[33m Björn Schotte",#27"[0m");
  41.   Writeln;
  42.   Writeln("has just been installed...");
  43.   If FromWB Then
  44.   Begin
  45.     Delay(2*50);
  46.     Close(output);
  47.   End;
  48. End;
  49.  
  50. Procedure removed;
  51. Begin
  52.   If FromWB Then
  53.   Begin
  54.     Reset(output,conpos);
  55.     If IOResult>0 Then exit;
  56.   End;
  57.   Writeln(#27"[33mLeftyMouse V1.0"#27"[0m");
  58.   Writeln("1993 by",#27,"[33m Björn Schotte",#27"[0m");
  59.   Writeln;
  60.   Writeln("has just been removed...");
  61.   If FromWB Then
  62.   Begin
  63.     Delay(2*50);
  64.     Close(output);
  65.   End;
  66. End;
  67.  
  68.  
  69.  
  70. {$opt b-,s-}
  71.  
  72. Function Handler (data: Ptr; event: p_InputEvent) : p_InputEvent;
  73.  
  74.   Var e2    : p_InputEvent;
  75.       err   : Boolean;
  76.  
  77.  
  78.   Begin
  79.     e2 := event;
  80.     Forbid;
  81.     While e2 <> Nil Do
  82.       Begin
  83.         If ((e2^.ie_Class and IECLASS_RAWMOUSE)<>0) Then
  84.         Begin
  85.          Case e2^.ie_Code Of
  86.            { LeftyMouse-Funktion }
  87.            IECODE_LBUTTON :
  88.              Begin
  89.                e2^.ie_Code:=IECODE_RBUTTON;
  90.              End;
  91.            IECODE_LBUTTON+128 :
  92.              Begin
  93.                e2^.ie_Code:=IECODE_RBUTTON+128;
  94.              End;
  95.            IECODE_RBUTTON :
  96.              Begin
  97.                e2^.ie_Code:=IECODE_LBUTTON;
  98.              End;
  99.            IECODE_RBUTTON+128 :
  100.              Begin
  101.                e2^.ie_Code:=IECODE_LBUTTON+128;
  102.              End;
  103.          Else End;
  104.         End;
  105.         e2 := e2^.ie_NextEvent          { nächstes Element der Liste }
  106.       End;
  107.     Permit;
  108.     Handler := event;            { Zeiger auf alte Liste zurückgeben }
  109.   End;
  110.  
  111. {$opt s0}
  112.  
  113. Begin { Hauptprogramm }
  114.   InterfaceCode :=
  115.     CodeTyp($48E7, $7F00,                    { MOVEM.L d1-d7,-(a7) }
  116.             $48E7, $00FE,                    { MOVEM.L a0-a6,-(a7) }
  117.             $4BF9, Addr(_paslibbase) shr 16,
  118.                    Addr(_paslibbase) and $FFFF,{ LEA _paslibbase,a5  }
  119.             $4EB9, Addr(Handler) shr 16,
  120.                    Addr(Handler) and $FFFF,  { JSR Handler         }
  121.             $4CDF, $7F00,                    { MOVEM.L (a7)+,a0-a6 }
  122.             $4CDF, $00FE,                    { MOVEM.L (a7)+,a1-a7 }
  123.             $4E75                            { RTS                 }
  124.            );
  125.   port := FindPort(MYPORTNAME);
  126.   If port<>NIL Then
  127.   Begin
  128.    ThisTask:=FindTask(LM_TASKNAME);
  129.    If ThisTask<>NIL Then
  130.    Begin
  131.     Signals:=ThisTask^.tc_SigWait;
  132.     Signal(ThisTask,Signals);
  133.     Halt(0);
  134.    End;
  135.   End;
  136.   port := CreatePort (MYPORTNAME, 0);
  137.   ioreq := CreateStdIO (port);
  138.   Open_Device ('input.device', 0, ioreq, 0);
  139.   { Alles für die Kommunikation zwischen Handler und Hauptprogramm
  140.     vorbereiten: }
  141.   ThisTask := FindTask (Nil);
  142.   ThisTask^.tc_Node.ln_Name:=LM_TASKNAME;
  143.   SigBit := AllocSignal(-1);
  144.   If SigBit=-1 Then Error("Kein Signal !");
  145.   { Interrupt-Struktur initialisieren: }
  146.   With inter, is_node Do
  147.     Begin
  148.       is_Code := ^InterfaceCode;
  149.       is_Data := Nil;
  150.       ln_Name := 'LeftyMouseHandler.[BS]';
  151.       ln_Pri  := 127
  152.     End;
  153.   { Jetzt wird's spannend: }
  154.   ioreq^.io_Data := ^inter;
  155.   ioreq^.io_Command := IND_ADDHANDLER;
  156.   err := DoIO (ioreq);
  157.   installed;
  158.   Sig:=Wait(1 Shl SigBit);
  159.   { System wieder aufräumen: }
  160.   ioreq^.io_Data := ^inter;
  161.   ioreq^.io_Command := IND_REMHANDLER;
  162.   err := DoIO (ioreq);
  163.   Close_Device (ioreq);
  164.   DeleteStdIO (ioreq);
  165.   DeletePort (port);
  166.   removed;
  167. End.
  168.  
  169.  
  170.  
  171.  
  172.  
  173.